#include "dbHelper.h"

QSqlDatabase dbHelper::openConnection(const QString &connectionName) {
    // [1] 创建连接的全名: 基于线程的地址和传入进来的 connectionName，因为同一个线程可能申请创建多个数据库连接
    QString baseConnectionName = "conn_" + QString::number(quint64(QThread::currentThread()), 16);
    QString fullConnectionName = baseConnectionName + connectionName;

    if (QSqlDatabase::contains(fullConnectionName))
    {
        // [2] 如果连接已经存在，复用它，而不是重新创建
        QSqlDatabase existingDb = QSqlDatabase::database(fullConnectionName);

        // [2.1] 返回连接前访问数据库，如果连接断开，可以重新建立连接 (测试: 关闭数据库几分钟后再启动，再次访问数据库)
        QSqlQuery query("SELECT 1", existingDb);

        if (query.lastError().type() != QSqlError::NoError && !existingDb.open()) {
            return QSqlDatabase();
        }

        return existingDb;
    }
    else  // [3] 如果连接不存在，则创建连接
    {
        // [4] 线程结束时，释放在此线程中创建的数据库连接
        QObject::connect(QThread::currentThread(), &QThread::finished, [fullConnectionName] {
            if (QSqlDatabase::contains(fullConnectionName)) {
                QSqlDatabase::removeDatabase(fullConnectionName);
            }
        });

        return createConnection(fullConnectionName);
    }
}

// 创建数据库连接
QSqlDatabase dbHelper::createConnection(const QString &connectionName) {
    // 创建一个新的数据库连接
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", connectionName);
    db.setDatabaseName("tec.db");

    if (db.open()) {
        return db;
    } else {
        return QSqlDatabase();
    }
}

void dbHelper::closeConnection(const QString &connectionName){
    QSqlDatabase::removeDatabase(connectionName);
}
